#!/usr/bin/env python
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.

DOCUMENTATION = """
---
module: ec2_iam_role
short_description: Create or delete iam roles.
description:
  - Can create or delete AwS iam roles.
version_added: "1.8"
author: Edward Zarecor
options:
  state:
    description:
      - create, update or delete the role
    required: true
    choices: ['present', 'absent']
  name:
    description:
      - Name for the role
    required: true
  vpc_id:
    description:
      - The VPC that this acl belongs to
    required: true
    default: null
extends_documentation_fragment: aws
"""

EXAMPLES = '''
- ec2_acl:
    name: public-acls
    state: present
    vpc_id: 'vpc-abababab'

'''

from ansible.module_utils.basic import *
from ansible.module_utils.ec2 import *
import sys
try:
    import boto
except ImportError:
    print "failed=True msg='boto required for this module'"
    sys.exit(1)

def present(connection, module):

    profile_name = module.params.get('instance_profile_name')
    role_name =  module.params.get('role_name')
    policies = module.params.get('policies')

    fetched_profile = None
    fetched_role = None

    profile_arn = None
    role_arn = None

    try:
        fetched_profile = connection.get_instance_profile(profile_name)
    except boto.exception.BotoServerError as bse:
        pass

    if not fetched_profile:
        instance_profile = connection.create_instance_profile(profile_name)
        profile_arn = instance_profile.arn
    else:
        profile_arn = fetched_profile.arn

    try:
        fetched_role = connection.get_role(role_name)
    except boto.exception.BotoServerError as bse:
        pass

    if not fetched_role:
        role = connection.create_role(role_name)
        role_arn = role.arn
    else:
        role_arn = fetched_role.arn

    if not fetched_profile and not fetched_role:
        connection.add_role_to_instance_profile(profile_name, role_name)

    for policy in policies:

        fetched_policy = None

        try:
            fetched_policy = connection.get_role_policy(role_name, policy['name'])
        except boto.exception.BotoServerError as bse:
            pass

        if not fetched_policy:
            connection.put_role_policy(role_name, policy['name'], policy['document'])
        else:
            # TODO: idempotent?
            connection.put_role_policy(role_name, policy['name'], policy['document'])


    module.exit_json(changed=True,
                     instance_profile_arn=profile_arn,
                     role_arn=role_arn)


def absent(connection, module):

    profile_name = module.params.get('instance_profile_name')
    role_name =  module.params.get('role_name')
    policies = module.params.get('policies')

    for policy in policies:
        try:
            connection.delete_role_policy(role_name,policy['name'])
        except boto.exception.BotoServerError as bse:
            # TODO: parse code to verify that this is not found case
            pass

    connection.remove_role_from_instance_profile(profile_name,role_name)
    connection.delete_role(role_name)
    connection.delete_instance_profile(profile_name)

    module.exit_json(changed=True)


def main():
    argument_spec = ec2_argument_spec()
    argument_spec.update(
        dict(
            state=dict(default='present', choices=['present', 'absent']),
            instance_profile_name=dict(required=True, type='str'),
            role_name=dict(required=True, type='str'),
            policies=dict(type='list')
        )
    )

    module = AnsibleModule(argument_spec=argument_spec)
    profile = module.params.get('profile')

    try:
        connection = boto.connect_iam(profile_name=profile)
    except boto.exception.NoAuthHandlerFound, e:
        module.fail_json(msg = str(e))

    state = module.params.get('state')

    if state == 'present':
        present(connection, module)
    elif state == 'absent':
        absent(connection, module)

main()
